// 获取用户频道的api

// 导入request(即axios模块)
import request from '@/utils/request.js'

// 导入vuex模块，以便知道当前用户是否登录系统
import store from '@/store/index.js'

// 本地持久化存储频道设置的key(游客 和 登录用户 分别设置)
const CHANNEL_KEY_TRAVEL = 'hm-channel-travel' // 游客key
const CHANNEL_KET_VIP = 'hm-channel-vip' // 登录用户Key

// 1.获取频道数据的相关api函数
// 当前函数不需要传递参数，从接口文档可知
export function apiChannelList () {
  // return:返回的是axios的执行结果
  // return request({
  //   url: '/app/v1_0/user/channels',
  //   method: 'get'
  // })

  // 对api函数做升级，使其能本地持久化
  // 1.先从localStorage里边获取频道数据
  // 2.如果缓存里有频道数据，直接使用即可
  // 3.如果没有数据，就使用axios获得频道数据

  // 根据用户是否登录的状态，获取对应的localStorage中的key

  // 通过Promise封装，通过resolve返回输出具体信息，await修饰就接收到了
  // 因为所有api接口的返回结果都是Promise对象，这样做兼容性更好，应用层代码就不用改了
  return new Promise(async (resolve) => {
    // 判断用户是否登录，并执行不同的key(localStorage)
    const key = store.state.user.token ? CHANNEL_KET_VIP : CHANNEL_KEY_TRAVEL

    // 获取本地频道数据
    const localChannels = localStorage.getItem(key)

    // localStorage内部存储的频道数据样子
    // [{id:xx,name:xx},{id:xx,name:xx}……]

    if (localChannels) {
      // 若有数据，输出频道数据给外部
      resolve({ channels: JSON.parse(localChannels) })
    } else {
      // 没有数据，频道没有被缓存，使用axios获取数据
      const result = await request({
        url: '/app/v1_0/user/channels',
        method: 'get'
      })

      // 本地存储频道数据
      localStorage.setItem(key, JSON.stringify(result.channels))
      // 输出频道数据给外部
      resolve(result)
    }
  })
}

// 2. 获取全部频道的api函数
export function apiChannelAll () {
  return request({
    url: '/app/v1_0/channels',
    method: 'get'
  })
}

// 3.添加频道的api函数
// 参数是对象：channel {id:xxx,name:xxx}
// 潜规则：api函数返回结果就是Promise对象，(根据之前封装axios得出来的结果)
// 处理：async + return
export async function apiChannelAdd (channel) {
// 判断用户是否登录，获得不同的key
  const key = store.state.user.token ? CHANNEL_KET_VIP : CHANNEL_KEY_TRAVEL

  // 从localStorage里，把已经拥有的频道获取出来,并做转换
  const cachechannels = JSON.parse(localStorage.getItem(key))

  // 对获取出来的频道，做添加操作
  cachechannels.push(channel)

  // 再把添加好的总的频道列表，维护到localStorage里，做持久添加
  localStorage.setItem(key, JSON.stringify(cachechannels))
  // 上述代码，不用返回具体的结果，使用return 只是为了返回一个Promise对象
  return null
}

// 4. 删除频道的api函数
export async function apiChannelDel (channel) {
// 判断用户是否登录，获得不同的key
  const key = store.state.user.token ? CHANNEL_KET_VIP : CHANNEL_KEY_TRAVEL

  // 1.从localStorage里，把已经拥有的频道获取出来,并做转换
  const cachechannels = JSON.parse(localStorage.getItem(key))

  // 2.对拥有的频道做删除操作，从LocalStorage里去除channel频道
  // 对“拥有的频道”做过滤，遍历， 把channel 给过滤掉
  // filter 过滤数组，返回过滤后的结果
  const tmpChannels = cachechannels.filter(item => {
    // 判断当前项目如果“不是”channel 就收集
    // 就是把 删除频道 的id过滤掉，返回的就是没有被删除的项目
    return channel.id !== item.id
  })

  // 3.把删除后的 剩余的我的频道 数据 再存储到localStorage里
  localStorage.setItem(key, JSON.stringify(tmpChannels))

  // return 一个Promise对象
  return null
}
